package ar.uba.is2.common.mensaje.puerto.impl;

import java.io.File;
import java.io.IOException;

import ar.uba.is2.common.mensaje.Componente;
import ar.uba.is2.common.mensaje.puerto.PuertoEntrada;
import ar.uba.is2.common.mensaje.puerto.PuertoFactory;
import ar.uba.is2.common.mensaje.puerto.PuertoSalida;

public class PuertoArchivoFactory implements PuertoFactory {

	private String prefijo;
    
	private static final File DIRECTORIO_MENSAJERIA;

    static {
        DIRECTORIO_MENSAJERIA = new File(System.getProperty("java.io.tmpdir"), "is2");

        if (!DIRECTORIO_MENSAJERIA.exists()) {

            boolean created = DIRECTORIO_MENSAJERIA.mkdirs();

            if (!created) {
                throw new RuntimeException(String.format("Error creando directorio de mensajes %s", DIRECTORIO_MENSAJERIA.getPath()));
            }

            if (!DIRECTORIO_MENSAJERIA.canRead() || !DIRECTORIO_MENSAJERIA.canWrite()) {
                throw new RuntimeException(String.format("No se puede leer o escribir en directorio de mensajes %s", DIRECTORIO_MENSAJERIA.getPath()));
            }
        }
    }


    public PuertoArchivoFactory(String prefijo) {
    	this.prefijo = prefijo; 
    }
    
    public PuertoEntrada crearPuertoEntrada(Componente receptor) throws IOException {
        String nombreDeArchivo = obtenerNombreDeArchivo(receptor);

        File entrada = new File(DIRECTORIO_MENSAJERIA, prefijo + nombreDeArchivo);

        PuertoArchivo p = new PuertoArchivo(entrada, null);
        return p;
    }

    public PuertoSalida crearPuertoSalida(Componente destino) throws IOException {
        String nombreDeArchivo = obtenerNombreDeArchivo( destino);

        File salida = new File(DIRECTORIO_MENSAJERIA, prefijo + nombreDeArchivo);

        PuertoArchivo p = new PuertoArchivo(null, salida);
        return p;
    }

    private String obtenerNombreDeArchivo(Componente receptor) {
        String nombre = receptor.getNombre();
        nombre = nombre.replaceAll("\\s+", "");
        nombre = nombre.concat(".msj");

        return nombre;
    }
}
